﻿#define _CRT_SECURE_NO_WARNINGS 1
#include"Func.h"
#include<iostream>
using namespace std;
//int main()
//{
//	//引用必须进行初始化
//	int a = 10;
//	int& ra ;//使用引用必须进行初始化
//	return 0;
//}
//typedef struct ListNode
//{
//	int val;
//	struct ListNode* next;
//}ListNode,*PListNode;
//void PushBack(PListNode& phead, int x)
//{
//	//代码逻辑是一样的
//}
//void PushBack(ListNode** phead, int x)//此时必须串二级指针，可能会是进行头插第一个节点
//{
//	//先为插入x 开辟节点
//
//	ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
//	if (newnode == NULL)
//	{
//		perror(" PushBack(ListNode** phead, int x)::malloc");
//		return;
//	}
//	newnode->val = x;
//	newnode->next = NULL;
//	if (*phead == NULL)
//	{
//		//此时第一次进行数据插入，需要改变的是结构体的指针
//		*phead = newnode;
//	}
//	else
//	{
//		//先找到最后一个节点，在进行插入
//		ListNode* tail = *phead;
//		while (tail->next != NULL)
//		{
//			tail = tail->next;
//		}
//		//找到尾结点
//		tail->next = newnode;
//	}
//}
//void PushBack(ListNode*& phead, int x)//引用传参，对于用户避免了对指针的使用
//{
//	//先为插入x 开辟节点
//	ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
//	if (newnode == NULL)
//	{
//		perror("PushBack(ListNode*& phead, int x)::malloc");
//		return;
//	}
//	newnode->val = x;
//	newnode->next = NULL;
//	if (phead == NULL)
//	{
//		phead = newnode;
//	}
//	else
//	{
//		ListNode* tail = phead;
//		while (tail->next)
//		{
//			tail = tail->next;
//		}
//		tail->next = newnode;
//	}
//}
//int main()
//{
//	ListNode* head = nullptr;
//	PushBack(head, 1);
//	PushBack(head, 2);
//	PushBack(head, 3);
//	PushBack(head, 4);
//	PushBack(head, 5);
//
//	return 0;
////}
//int& Count()
//{
//	 int n = 0;
//	n++;
//	return n;
//}
//int main()
//{
//	int & ret  = Count();
//	printf("%d\n", ret);//输出啥？？
//	printf("%d\n", ret);//输出啥？？
//
//	return 0;
//}
//int& Add(int a, int b)
//{
//	int c = a + b;
//	return c;
//}
//int main()
//{
//	int& ret = Add(1, 2);
//	Add(3, 4);
//	cout << "Add(1, 2) is :" << ret << endl;//输出啥？？？
//	return 0;
//}
//#include<assert.h>
//typedef struct SeqList
//{
//	int* a;
//	int sz;//有效的数据个数
//	int capacity;//记录空间容量
//}SList;
//void InitSlist(SList* plist)
//{
//	plist->capacity = plist->sz = 0;
//	plist->a = NULL;
//}
//void CheckCapacity(SList* plist)
//{
//	if (plist->sz == plist->capacity)
//	{
//		int newcapacity = plist->capacity == 0 ? 4: (2 * (plist->capacity));
//		int* tmp = (int*)realloc(plist->a, sizeof(int) * newcapacity);
//		if (tmp == NULL)
//		{
//			perror("CheckCapacity(SList* plist)::realloc()");
//			return;
//		}
//		//指标更新
//		plist->a = tmp;
//		plist->capacity = newcapacity;
//	}
//}
//void PushSList(SList* plist, int val)
//{
//	CheckCapacity(plist);
//	plist->a[plist->sz] = val;
//	plist->sz++;
//}
//
//void ModifySList(SList* plist, int i, int val)
//{
//	
//	assert(i < plist->sz);//确保位置合法
//	plist->a[i] = val;
//}
//int& ReturnData(SList plist, int pos)//返回指定位置的数据
//{
//	assert(pos < plist.sz);
//	return plist.a[pos];//出了当前函数作用域，返回的对象还是存在
//}
//int main()
//{
//	SList list;
//	InitSlist(&list);
//	PushSList(&list, 1);
//	PushSList(&list, 2);
//	PushSList(&list, 3);
//	PushSList(&list, 4);
//	PushSList(&list, 4);
//	PushSList(&list, 4);
//	int ret = ReturnData(list, 3);
//	ReturnData(list, 2) = 33;
//
//	return 0;
//}
/*
以inline修饰的函数叫做内联函数，编译时C++编译器会在调用内联函数的地方展开，没有函数调 用建立栈帧的开销，内联函数提升程序运行的效率。
*/
//int main()
//{
//      int a = 1;
//	const int& ra = a;
//}
//int main()
//{
//	//f(0); //链接错误
//	fx();  // 为什么此时编译链接无误？？？
//}
// 当在同一行声明多个变量时，必须保证所有变量都是同一种类型
typedef char* pstring;

int main()
{
	char ch = 'a';
	const pstring p1 = &ch;// 编译成功还是失败？
	//const 此时修的是变量p1，所以此时p1是一个常量，p1 的类型是pstring类型（char*）
	// 也就说const 此时修饰的是一个 指向字符常量的指针
	// 需要字符地址进行初始化
	
	//const pstring* p2;// 编译成功还是失败？
	return 0;

}
//int main()
//{
//	// 范围for 的引用
//
//	int arr[5] = { 1,2,3,4,5 };
//	for (auto& e : arr)
//	{
//		cout << e << ' ';//依次输出每一个元素
//	}
//	cout << endl;
//	for (auto& e:arr) //e 是对数组每一个元素的引用
//	{
//		e *= 2;
//	}
//	//for循环后的括号由冒号“ ：”分为两部分：第一部分是范围内用于迭代的变量，第二部分则表示被迭代的范围。
//	for (auto e : arr)
//	{
//		cout << e << ' ';
//	}
//	return 0;
//}

//void f(int)
//{
//	cout << "f(int)" << endl;
//}
//void f(int*)
//{
//	cout << "f(int*)" << endl;
//}
//int main()
//{
//	// nullptr
//	f(0);//输出是啥
//
//	f(NULL);//输出是啥
//
//	f((int*)NULL);
//	return 0;
//}